#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName  :abstest.py
# @Time      :2021/3/1 13:35
# @Author    :Letquit
"""
文件说明：定义函数   参数检查

"""
# 在Python中，定义一个函数要使用def语句，依次写出函数名、括号、括号中的参数和冒号:，
# 然后，在缩进块中编写函数体，函数的返回值用return语句返回


def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x


print(my_abs(-100))
# 函数体内部的语句在执行时，一旦执行到return时，函数就执行完毕，并将结果返回。
# 因此，函数内部通过条件判断和循环可以实现非常复杂的逻辑
# 如果没有return语句，函数执行完毕后也会返回结果，只是结果为None。return None可以简写为return

# 参数检查
# 调用函数时，如果参数个数不对，Python解释器会自动检查出来，并抛出TypeError
# my_abs(1, 2)
# TypeError: my_abs() takes 1 positional argument but 2 were given
# 但是如果参数类型不对，Python解释器就无法帮我们检查。试试my_abs和内置函数abs的差别
# my_abs('A')
# TypeError: '>=' not supported between instances of 'str' and 'int'
# abs('A')
# TypeError: bad operand type for abs(): 'str'
# 当传入了不恰当的参数时，内置函数abs会检查出参数错误，而我们定义的my_abs没有参数检查，
# 会导致if语句出错，出错信息和abs不一样。所以，这个函数定义不够完善。
# 让我们修改一下my_abs的定义，对参数类型做检查，只允许整数和浮点数类型的参数。
# 数据类型检查可以用内置函数isinstance()实现
# my_abs('A')
# TypeError: bad operand type

if __name__ == "__main__":
    run_code = 0
